package algorithm.middle;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: EvalRPN150
 * @description: 150. 逆波兰表达式求值
 * @date 2021/3/209:59
 * @since V1.0
 * 根据 逆波兰表示法，求表达式的值。
 *
 * 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 *
 *
 *
 * 说明：
 *
 *     整数除法只保留整数部分。
 *     给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 *
 *
 *
 * 示例 1：
 *
 * 输入：tokens = ["2","1","+","3","*"]
 * 输出：9
 * 解释：该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class EvalRPN150 {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String item:tokens){
            //匹配整数
            if (item.matches("^-?[0-9]\\d*$")){
                stack.push(Integer.parseInt(item));
            }else if (item.equals("+") ){
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1+num2);
            }else if (item.equals("-")){
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1-num2);
            }else if (item.equals("*")){
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1*num2);
            }else if (item.equals("/")){
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1/num2);
            }
        }
        return stack.pop();
    }
}
